import camelCase from 'lodash/camelCase';
import kebabCase from 'lodash/kebabCase';
import { isFunction, isString } from './validate';


// 同时支持驼峰命名和中划线命名的插槽，示例：value-display 和 valueDisplay
export function handleSlots(vm, name, params) {
  // 检查是否存在 驼峰命名 的插槽
  let node = vm.$scopedSlots[camelCase(name)]?.(params || vm.$createElement);
  if (node) { return node; }

  // 检查是否存在 中划线命名 的插槽
  node = vm.$scopedSlots[kebabCase(name)]?.(params || vm.$createElement);
  if (node) { return node; }

  return null;
}

/**
 * 先通过JSX的方式渲染，后通过插槽，最后渲染默认节点
 * @param vm 组件实例
 * @param name 渲染函数或插槽名称
 * @param options 值可能为默认渲染节点，也可能是默认渲染节点和参数的集合
 * @example renderTNodeJSX(this, 'closeBtn')  优先级 props function 大于 插槽
 * @example renderTNodeJSX(this, 'closeBtn', <t-icon-close />)。
 * @example renderTNodeJSX(this, 'closeBtn', { defaultNode: <t-icon-close />, params })。 params 为渲染节点时所需的参数
 */
export function renderNodeJSX(vm, name, options) {
  let params = typeof options === 'object' && 'params' in options ? options.params : null;

  if (isFunction(name)) {
    return name.call(vm, vm.$createElement, params);
  }
  
  if (isString(name) && (vm.$scopedSlots[camelCase(name)] || vm.$scopedSlots[kebabCase(name)])) {
    return handleSlots(vm, name, params);
  }
  
  const defaultNode = typeof options === 'object' && 'defaultNode' in options ? options.defaultNode : options;

  if (isFunction(defaultNode)) {
    return defaultNode.call(vm, vm.$createElement, params);
  }

  return defaultNode || null;
}



/**
 * 获取jxs或者渲染函数
 * @param vm 组件实例
 * @param name 渲染函数或插槽名称
 */
export function getNodeJSX(vm, name) {
  if (isFunction(name)) {
    return name;
  }
  
  if (isString(name) && isFunction((vm.$scopedSlots[camelCase(name)] || vm.$scopedSlots[kebabCase(name)]))) {
    return vm.$scopedSlots[camelCase(name)] || vm.$scopedSlots[kebabCase(name)];
  }

  return null;
}
